#ifndef MAINWINDOW_H
#define MAINWINDOW_H

/*
 * 主窗口类，实现用户交互
 * 功能：模式选择、计算过程控制、计算结果记录等
*/

#include <QMainWindow>
#include <QSoundEffect>
#include <QStandardItemModel>
#include "EightQueenSolver.h"
#include "MultiThreadSolver.h"

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow {
  Q_OBJECT

 public:
  MainWindow(QWidget* parent = nullptr);
  ~MainWindow();

 public slots:
  void spinN(int n);  // N值选择框值变化响应
  void calc();        // 计算按钮响应
  void multiCalc();   // 多线程计算按钮相应
  void pause();       // 暂停按钮响应
  void stop();        // 停止按钮响应
  void singleStep();  // 单步计算按钮响应

  void solve();         // 解题
  void showCalcData();  // 显示计算结果
  void showStopData();  // 显示停止结果
  void updateBoard();   // 更新棋盘显示

  void normalMode();       // 普通模式
  void singleStepMode();   // 单步模式
  void multiThreadMode();  // 多线程模式

 private:
  Ui::MainWindow* ui;

  EightQueenSolver* solver;        // 八皇后算法类
  MultiThreadSolver* multiSolver;  // 多线程算法类

  enum Mode {
    NORMAL,       // 普通模式
    SINGLE_STEP,  // 单步模式
    MULTI_THREAD  // 多线程模式
  } m_mode;

  // 线程管理
  QMutex* mutex;
  QWaitCondition* wait;

  QStandardItemModel* table;
};
#endif  // MAINWINDOW_H
